package com.cskaoyan.javase.oop1._6constructor;

/**
 * 总结一下,到目前为止,在创建对象过程中,给成员变量的赋值方式:
 *      1.默认初始化,具有默认值
 *      2.显式赋值
 *      3.构造器赋值
 *
 * 在整个面向对象学习过程中,我们需要多次研究成员变量的赋值顺序/赋值结果,总体要遵循"掐头去尾"的原则:
 *      1.头: 永远第一步是默认初始化,具有默认值
 *      2.尾: 永远的最后一步是构造器赋值
 *      3.中间再考虑其他的赋值方式
 *
 * 以上赋值,还没有特别多的花样,一定要记住,并且理解
 * 实践中,我们可以使用idea的debug模式,来学习成员变量赋值的顺序
 *
 * Debug模式中,variables窗口中
 *      p标签 表示parameter 参数,一般指方法的参数
 *      f标签 标示field 字段,指的是对象中的成员变量
 *
 * 总结:
 *      首先代码会去找到创建对象的构造器
 *      但是不会立刻执行该构造器代码
 *      而是从上到下执行成员变量的显式赋值
 *      最后执行构造器代码
 *      总之,还是为了保证构造器的代码最后执行,构造器的赋值绝对准确
 *
 * @since 17:13
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        // 创建对象
        Phone p = new Phone();
        System.out.println(p.price);
        System.out.println(p.brand);
        System.out.println(p.name);

        /*
            p2对象创建对象过程中
            赋值顺序是:
                1.默认初始化
                2.显式赋值
                3.构造器赋值
         */
        System.out.println("---------------------");
        Phone p2 = new Phone("苹果", 12000, "iPhone 12 Pro Max");
        System.out.println(p2.price);
        System.out.println(p2.brand);
        System.out.println(p2.name);
    }
}

class Phone {
    // 显式赋值
    String brand = "三星";
    double price = 6780;
    String name = "Galaxy S22";

    public void call() {
        System.out.println("用手机打电话!");
    }

    public Phone() {
    }

    public Phone(String brand, double price, String name) {
        this.brand = brand;
        this.price = price;
        this.name = name;
    }
}